import store from '@/store'
import { Toast } from 'antd-mobile'
import axios from 'axios'
import history from './history'
import { getTokenInfo, removeTokenInfo, setTokenInfo } from './storage'

// 请求基地址
export const baseURL = 'http://geek.itheima.net'

const http = axios.create({
  baseURL: baseURL,
  timeout: 5000,
})

// 请求拦截器
http.interceptors.request.use(
  function (config: any) {
    const { token } = getTokenInfo()
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  function (error) {
    return Promise.reject(error)
  }
)

// 响应拦截器
http.interceptors.response.use(
  function (response) {
    return response.data
  },
  async function (error) {
    // 如果没有网络，respose等于undefined

    // 网络错误
    if (!error.response) {
      Toast.show({ content: '网络开了小差，请稍后再试。。。。。' })
    }
    // 验证码验证错误，以及验证码还没过一分钟
    else if (error.response.status !== 401) {
      Toast.show({
        content: error.response.data.message,
      })
    } else {
      try {
        // 用户认证错误，token超时或者没有token
        const { refresh_token } = getTokenInfo()
        // 发送请求获取refreshtoken
        if (refresh_token) {
          const res = await axios({
            url: baseURL + `/v1_0/authorizations`,
            method: 'PUT',
            headers: {
              'Content-Type': 'application/x-www-form-urlencoded',
              Authorization: `Bearer ` + refresh_token,
            },
          })
          // 拿到refreshtoken
          const refresh = res.data.data.token
          const tokens = { token: refresh, refresh_token: refresh_token }
          // 本地存储token
          setTokenInfo(tokens)
          // 存储到redux中
          store.dispatch({ type: 'user/getUserToken', payload: tokens })
          // 重新在http中添加token
          http(error.config)
        }
      } catch (error) {
        console.dir(error)
        // token以及refreshtoken都失效的情况处理
        // 提示用户
        await Toast.show({ content: '登录已经过期，请重新登录。。' })
        // 删除本地的token
        removeTokenInfo()
        // 移除redux中的token
        store.dispatch({ type: 'user/clearAuth' })
        // 跳转登录页并且记录下来pathname
        history.push('/login', { from: history.location.pathname })
      }
    }
    return Promise.reject(error)
  }
)

export default http
